/**
 * @file classfile.h
 * Funções para leitura e impressão do .class e conversão para big-endian.
 */

#ifndef _CHASSFILE_H_
#define _CHASSFILE_H_

#include "common.h"

/* / Altera a ordem de 2 bytes : xy -> yx */
#define SWAP_2(x) ( (((x) & 0xff) << 8) | ((unsigned short)(x) >> 8) )

/* / altera a ordem de 4 bytes : xywz -> zwyx */
#define SWAP_4(x) ( ((x) << 24) | \
         (((x) << 8) & 0x00ff0000) | \
         (((x) >> 8) & 0x0000ff00) | \
         ((x) >> 24) )

/* / Converte 2 bytes de little-endian para big-endian */
#define FIX_2(x) (*(unsigned short *)&(x) = SWAP_2(*(unsigned short *)&(x)))

/* / Converte 4 bytes de little-endian para big-endian */
#define FIX_4(x)   (*(unsigned int *)&(x)   = SWAP_4(*(unsigned int *)&(x)))

/* / Utilizado apenas para legibilidade e facilidade de escrita */
#define CP_INFO(i) constant_pool[(i)].info

#define CP_INFO(i) constant_pool[(i)].info

/**
 * Carrega a classe
 *
 * @param class_name Nome da classe
 */
void loadClass(char *class_name);

class_file *get_class(class_list *l, char *class_name);

/**
 * Imprime a classe
 *
 * @param in O arquivo .class
 */
void printclass(class_file *in);

/**
 * Procura um método.
 *
 * @param method_name Nome do método
 * @return As informações do método
 */
method_info *get_method(char *method_name);

/**
 * Informa o índice do método no constant pool.
 *
 * @param method_name Nome do método
 * @return O índice
 */
u4 get_method_index(char *method_name);

#endif
